DATA SEGMENT 
;-接口区-
IO8255C EQU 28AH              ;8255 PC口
IO8255D EQU 28BH              ;8255 控制端口 
;-数码表- 数码表对应详见文件尾部
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,67H,77H,7CH,39H,5EH,79H,71H,80H,0FFH 
;-提示信息区-
HC DB 0AH,0DH,'$'
TS DB 'Look led display states',0DH,0AH,'$'
TS1 DB 'Press Y continue, others exit.',0DH,0AH,'$'
TS2 DB 'Please turn off box power.',0DH,0AH,'$'
DATA ENDS 
CODE SEGMENT 

ASSUME CS:CODE,DS:DATA 
START: 
      ;数据段初始化
      MOV AX,DATA 
      MOV DS,AX 
      ;打印提示信息
      LEA DX,TS 
      MOV AH, 9 
      INT 21H 
      ;向8255控制端口写80H(1000 0000) 
      ;(1)特征位 (00)A方式0 (0)A输出 
      ;(0)C高4位输出 (0)B方式0 (0)B输出 (0)C低4位输出
      ;即ABC皆输出 工作方式为0
      MOV DX,IO8255D 
      MOV AL,80H 
      OUT DX,AL 

;SZ 初始化设置
SZ:   MOV CX,18      ;循环18次 
      LEA BX,LED     ;将数码表的入口偏移给BX
;XS 逐个显示
      ;将数码写入8255的C端 从而可以传给数码管
XS:   MOV AL,[BX]    ;DS:BX 对应的数码 给AL
      MOV DX,IO8255C 
      OUT DX,AL 
      CALL DELAY    ;延时 
      INC BX        ;BX指向下一个数码
      LOOP XS 
 ;提示用户是否继续     
      LEA DX,TS1 ;显示信息
      MOV AH,9 
      INT 21H 
      
      MOV AH,1  ;接收用户输入
      INT 21H 
      LEA DX,HC   ;输出一组换行
      MOV AH,9
      INT 21H     
      CMP AL,'Y' ;若用户输入是'Y'退出 反之则跳SZ继续循环显示
      JNZ EXIT 
      JMP SZ 

;延时函数 延时时间为 (CX)*(SI)个DEC SI指令时间 
DELAY: PUSH CX 
      MOV CX,0FFFFH 
FF:   MOV SI,05FFH 
ZJ:   DEC SI 
      JNZ ZJ
      LOOP FF 
      POP CX 
      RET 

;打印信息并退出 
EXIT: LEA DX,TS2 
      MOV AH,9 
      INT 21H 
      MOV AH,4CH 
      INT 21H 

CODE ENDS 
END START 

;数码表说明      
;     h g f e d c b a  字符
; 3FH(0 0 1 1 1 1 1 1)  0
; 06H(0 0 0 0 0 1 1 0)  1 
; 5BH(0 1 0 1 1 0 1 1)  2
; 4FH(0 1 0 0 1 1 1 1)  3
; 66H(0 1 1 0 0 1 1 0)  4
; 6DH(0 1 1 0 1 1 0 1)  5
; 7DH(0 1 1 1 1 1 0 1)  6
; 07H(0 0 0 0 0 1 1 1)  7
; 7FH(0 1 1 1 1 1 1 1)  8
; 67H(0 1 1 0 0 1 1 1)  9
; 77H(0 1 1 1 0 1 1 1)  A
; 7CH(0 1 1 1 1 1 0 0)  b
; 39H(0 0 1 1 1 0 0 1)  C
; 5EH(0 1 0 1 1 1 1 0)  d
; 79H(0 1 1 1 1 0 0 1)  E
; 71H(0 1 1 1 0 0 0 1)  F
; 80H(1 0 0 0 0 0 0 0)  .
;0FFH(1 1 1 1 1 1 1 1)  8.
